/**
 * 用户登录控制器类，用于处理与用户登录相关的接口请求。
 * 包括测试接口、普通用户登录接口以及微信登录接口。
 */
package com.xxgc.zde.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xxgc.zde.api.WechatApi;
import com.xxgc.zde.api.response.WechatLoginResponse;
import com.xxgc.zde.controller.dto.UserLoginDTO;
import com.xxgc.zde.controller.vo.UserLoginVO;
import com.xxgc.zde.entity.UsersEntity;
import com.xxgc.zde.entity.UsersEntityRepository;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.dtflys.forest.Forest;

/* ResponseBody + Controller */
@RestController
@RequestMapping("/login") // 定义该控制器的基础路径为 /login
@Tag(name = "登录接口") // Swagger 文档中对该接口的标记名称
public class UserLoginController {

    /**
     * 测试接口，用于验证服务是否正常运行。
     *
     * @return 返回字符串 "成功编写了第一个接口"，表示接口可用。
     */
    @Operation(summary = "测试通讯用") // Swagger 中的描述：测试通讯用
    @GetMapping("/msg") // 定义 GET 请求路径为 /login/msg
    public String msg() {
        return "成功编写了第一个接口";
    }

    /**
     * 用户登录接口，接收用户登录信息并返回登录结果。
     * 目前该方法未实现具体逻辑，直接返回 null。
     *
     * @param userLoginVO 用户登录的输入对象（包含用户名、密码等信息）。
     * @return 返回用户登录的结果对象（UserLoginDTO），目前未实现。
     */
    @Operation(summary = "用户登录") // Swagger 中的描述：用户登录
    @PostMapping("/userLogin") // 定义 POST 请求路径为 /login/userLogin
    public UserLoginDTO userLogin(@RequestBody UserLoginVO userLoginVO) {
        return null; // 未实现具体逻辑
    }

    // 微信登录相关配置
    private static final String AppId = "wxb1d1194cc8264f3e"; // 微信应用的 AppId
    private static final String AppSecret = "483ffb9dc0573da951425e56c10fd95e"; // 微信应用的 AppSecret

    /**
     * 注入 WechatApi 接口，用于调用微信登录相关 API。
     */
    @Autowired
    private WechatApi wechatApi;

    /**
     * 注入 UsersEntityRepository，用于操作数据库中的用户表。
     */
    @Autowired
    private UsersEntityRepository usersEntityRepository;

    /**
     * 微信登录接口，通过微信授权码获取用户信息并完成登录或注册。
     *
     * @param code 微信授权码，由前端传递。
     * @return 返回用户的唯一标识 ID。
     */
    @Operation(summary = "微信登录") // Swagger 中的描述：微信登录
    @PostMapping("/wechatLogin/{code}") // 定义 POST 请求路径为 /login/wechatLogin/{code}
    public String wxLogin(@PathVariable String code) {
        System.out.println("code data =" + code); // 打印接收到的微信授权码

        // 调用微信 API 获取微信登录响应数据
        WechatLoginResponse wechatLoginResponse = wechatApi.getWechat(
                AppId, // 微信应用的 AppId
                AppSecret, // 微信应用的 AppSecret
                code, // 微信授权码
                "authorization_code" // 授权类型
        );
        System.out.println("wxLogin =" + wechatLoginResponse); // 打印微信登录响应数据

        // 查询数据库中是否存在该微信用户
        QueryWrapper<UsersEntity> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("openid", wechatLoginResponse.getOpenid()); // 根据 openid 查询用户
        UsersEntity user = usersEntityRepository.getOne(queryWrapper); // 获取用户实体
        System.out.println("user =" + user); // 打印查询到的用户信息

        // 如果用户不存在，则创建新用户并保存到数据库
        if (user == null) {
            user = new UsersEntity(); // 创建新的用户实体
            user.setOpenid(wechatLoginResponse.getOpenid()); // 设置用户的 openid
            usersEntityRepository.save(user); // 保存用户到数据库
            System.out.println("user =" + user); // 打印新创建的用户信息
        }

        // 返回用户的唯一标识 ID
        return user.getId();
    }
}
